<?php

class Paginador {
  var $intPaginaActual          ;
  var $bolPosiblePaginaAnterior ;
  var $bolPosiblePaginaSiguiente;
  var $intNumPaginas            ;
  var $intProdsPorPagina        ;
  var $bolYaPaginados           ;
  var $bolMostrarTodos          ;
  var $arrObjetos               ;

  /**
   * Constructor para los paginadores
   *
   * @param Array   $arrObjetos        Arreglo de objetos que se manejarán. Si este parametro es una cadena, se considerará que es un select que obtendrá a los objetos (Este select generalmente viene de un objeto Filtro)
   * @param int     $intPaginaActual   Pagina actual
   * @param int     $intProdsPorPagina Productos que se mostrarán por página
   * @param String  $strClase          Clase que manejará cada objeto (Los objetos de esta clase serán instancias de $strClase)
   * 
   */
  function Paginador($arrObjetos, $intPaginaActual = 1, $intProdsPorPagina = 3, $strClase = "") {
    
    
    if(($intPaginaActual - 0) == 0) {
      $intPaginaActual = 1;
    } else {
      $intPaginaActual -= 0;
    }
    
    $this->intProdsPorPagina = ($intProdsPorPagina - 0 ? $intProdsPorPagina - 0 : 1);
    $this->bolMostrarTodos   = false;
    
    if((!is_array($arrObjetos)) && (strlen($arrObjetos) > 0)) {
      /*
       * En caso de que lo que se pas� sea una consulta, esta se tomar� 
       * como la consulta para obtener TODOS los objetos, por lo que se 
       * deben hacer dos subconsultas:
       *
       * una subconsulta con un count para saber cuantos objetos existen
       * Otra subconsulta con un limit para obtener los objetos
       *
       * En este caso, se pasar� el cuarto parametro (strClase), con el que se construir�n los objetos
       */
       
       $this->bolYaPaginados = true;
       
       $oConecta = new Conecta();
       
       if($intPaginaActual < 0) {
         $intPaginaActual      *= -1;
         $this->bolMostrarTodos = true;
         $strLimit              = "";
         $this->intProdsPorPagina = 1000;
       } else {
//         $strLimit = " LIMIT " . (($intPaginaActual - 1) * $this->intProdsPorPagina) . ", " . $this->intProdsPorPagina;
       }
       $strLimit = " LIMIT " . (($intPaginaActual - 1) * $this->intProdsPorPagina) . ", " . $this->intProdsPorPagina;
       
       $strConsultaOrig  = $arrObjetos;
       $strConsultaObjs  = "SELECT * " . strstr($strConsultaOrig, "FROM");
       
       $strConsultaCount    = "SELECT COUNT(*) AS cuantos " . strstr($strConsultaOrig, "FROM");
       $oConecta->Consulta($strConsultaCount);
       $intTotalObjetos     = $oConecta->Field('cuantos');
       $this->intNumPaginas = ceil($intTotalObjetos / $this->intProdsPorPagina);
       
       
       $strConsultaObjs .= $strLimit;
       
       $oConecta->Consulta($strConsultaObjs);

       if($strClase) {
         $i = 0;
         while(!$oConecta->EOF) {
           eval("\$this->arrObjetos[$i] = new $strClase();");
           $this->arrObjetos[$i]->LlenarObjeto($oConecta->GetColumn());
           $oConecta->MoveNext();
           $i++;
         }
       } else {
         while(!$oConecta->EOF) {
           $this->arrObjetos[] = $oConecta->GetColumn();
           $oConecta->MoveNext();
         }
       }
    } else {
      $this->bolYaPaginados    = false;
      $this->arrObjetos        = $arrObjetos;

      if($intPaginaActual < 0) {
        $this->intProdsPorPagina = 1000;
      }
      
      $this->intNumPaginas     = ceil(count($this->arrObjetos) / $this->intProdsPorPagina);
    }
    
    if($intPaginaActual < 0) {
      $intPaginaActual *= -1;
      $this->bolMostrarTodos = true;
    }
    
    $this->intPaginaActual   = $intPaginaActual;
    
    if($this->intPaginaActual == 1) {
      $this->bolPosiblePaginaAnterior = false;
    } else {
      $this->bolPosiblePaginaAnterior = true;
    }
    
    if($this->intPaginaActual < $this->intNumPaginas) {
      $this->bolPosiblePaginaSiguiente = true;
    } else {
      $this->bolPosiblePaginaSiguiente = false;
    }
  }

  /**
   * Función que obtiene los objetos que se desplegarán en la página actual.
   *
   * @return Array 
   */
  function ObtenerArregloActual() {
    if($this->bolYaPaginados) {
      return $this->arrObjetos;
    }
    
    $arrRet = Array();
    for($i = 0; $i < $this->intProdsPorPagina; $i++) {
      if(!isset($this->arrObjetos[($this->intProdsPorPagina * ($this->intPaginaActual - 1)) + $i])) {
        break;
      }
      $arrRet[] = $this->arrObjetos[($this->intProdsPorPagina * ($this->intPaginaActual - 1)) + $i];
    }
    
    return $arrRet;
  }

  /**
   * Función que obtiene un template en HTML con los botones del paginador "Anterior", "Siguiente", etc.
   *
   * @param String  $strRows      Contenido extra del template paginador.
   * @param int     $intNumCols   Columnas que existen en la tabla
   * @param String  $strOpcion    Opción a la que mandará el paginador al ir a la página anterior, siguiente, primera o última ( option= )
   * @param Boolean $bolRowsSinTD Indica si el
   * 
   * @global Template $oTemplate
   *
   * @return String Template del paginador en HTML
   */
  function ObtenerTemplate($strRows, $intNumCols, $strOpcion, $bolRowsSinTD = false) {
    if($bolRowsSinTD) {
      $strRows = "<tr><td colspan='$intNumCols'>$strRows</td></tr>";
    }
    
    global $oTemplate;
    
    if(!$this->bolPosiblePaginaAnterior) {
      $strShowButtonAnt = "none";
    } else {
      $strShowButtonAnt = "";
    }
    
    if(!$this->bolPosiblePaginaSiguiente) {
      $strShowButtonSig = "none";
    } else {
      $strShowButtonSig = "";
    }
    
    $intPagAnt  = $this->intPaginaActual - 1;
    $intPagSig  = $this->intPaginaActual + 1;
    $strPagAct  = $this->intPaginaActual;
    $strTotPags = $this->intNumPaginas  ;
    
    eval('$strRes = "' . $oTemplate->Get('paginador.tpl.php') . '";');
    
    return $strRes;
  }

  /**
   * Función que regresa el estilo que debe tener el boton de anterior ('none' si no hay página anterior)
   *
   * @return String estilo que debe tener el boton de anterior
   */
  function EstiloPagAnt() {
    if($this->bolPosiblePaginaAnterior) {
      return '';
    } else {
      return 'none';
    }
  }
  
  /**
   * Función que regresa el estilo que debe tener el boton de siguiente ('none' si no hay página siguiente)
   *
   * @return String estilo que debe tener el boton de siguiente
   */
  function EstiloPagSig() {
    if($this->bolPosiblePaginaSiguiente) {
      return '';
    } else {
      return 'none';
    }
  }
}
?>
